<?php

/**
 * Classe utilitaire de gestion de la Base de Données
 *
 * @author OALBERT
 */
class ModelePDO {

    //Attributs utiles pour la connexion
    protected static $serveur = MySqlConfig::SERVEUR;
    protected static $base = MySqlConfig::BASE;
    protected static $utilisateur = MySqlConfig::UTILISATEUR;
    protected static $passe = MySqlConfig::MOT_DE_PASSE;
    //Attributs utiles pour la manipulation PDO de la BD
    /**
     *
     * @var PDO
     */
    protected static $pdoCnxBase = null;

    /**
     *
     * @var PDOStatement
     */
    protected static $pdoStResults = null;
    protected static $requete = "";
    protected static $resultat = null;

    /**
     * Permet de se connecter à la base de données
     * Retourne true si la connexion est établie, false sinon
     */
    protected static function seConnecter() {

        //Doc officielle connexion/déconnexion : http://www.php.net/manual/fr/pdo.connections.php
        //voir remarque sur les connexions PERSISTANTES : une seule connexion et plus rapide ensuite...
        // mais dans certains cas... Attention aux nombres de connexions simultanées


        if (!isset(self::$pdoCnxBase)) { //Il n'y a pas encore eu de connexion
            try {
                self::$pdoCnxBase = new PDO('mysql:host=' . self::$serveur . ';dbname=' . self::$base, self::$utilisateur, self::$passe);
                self::$pdoCnxBase->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
                self::$pdoCnxBase->query("SET CHARACTER SET utf8");
            } catch (Exception $e) {
                echo $e->getMessage();
            }
        }
    }

    protected static function seDeconnecter() {
        self::$pdoCnxBase = null;

        //si on n'appelle pas la méthode, la déconnexion a lieu en fin de script
    }

    public static function getLesTuples($table) {
        self::seConnecter();

        self::$requete = "SELECT * FROM " . $table;
        self::$pdoStResults = self::$pdoCnxBase->prepare(self::$requete);
        self::$pdoStResults->execute();
        self::$resultat = self::$pdoStResults->fetchAll(PDO::FETCH_OBJ);

        self::$pdoStResults->closeCursor();

        return self::$resultat;
    }

    public static function getPremierTupleByChamp($table, $nomChamp, $valeurChamp) {
        self::seConnecter();

        self::$requete = "SELECT * FROM " . $table . " WHERE " . $nomChamp . " = :valeurChamp";
        self::$pdoStResults = self::$pdoCnxBase->prepare(self::$requete);
        self::$pdoStResults->bindParam(':valeurChamp', $valeurChamp);
        self::$pdoStResults->execute();
        self::$resultat = self::$pdoStResults->fetch(PDO::FETCH_OBJ);
        self::$pdoStResults->closeCursor();

        return self::$resultat; //un seul tuple retourné : utilization de fetch()
    }

    public static function getLesTuplesByChamp($table, $nomChamp, $valeurChamp) {

        self::seConnecter();

        self::$requete = "SELECT * FROM " . $table . " WHERE " . $nomChamp . " = :valeurChamp";
        self::$pdoStResults = self::$pdoCnxBase->prepare(self::$requete);
        self::$pdoStResults->bindParam(':valeurChamp', $valeurChamp);
        self::$pdoStResults->execute();
        self::$resultat = self::$pdoStResults->fetchAll(PDO::FETCH_OBJ);

        self::$pdoStResults->closeCursor();

        return self::$resultat;
    }

    public static function supprimerTupleByChamp($table, $nomChamp, $valeurChamp) {

        self::seConnecter();
        $requete = "DELETE FROM " . $table . " WHERE " . $nomChamp . " = " . $valeurChamp .";";

        self::$pdoStResults = self::$pdoCnxBase->prepare($requete);
        //self::$pdoStResults->bindParam(':valeurChamp', $valeurChamp);

        self::$pdoStResults->execute();
    }

    public static function select($champs, $tables, $conditions = null) {
        self::seConnecter();

        self::$requete = "SELECT " . $champs . " FROM " . $tables;

        if ($conditions != null)
            self::$requete .= " WHERE " . $conditions . ";";

        self::$pdoStResults = self::$pdoCnxBase->prepare(self::$requete);

        self::$pdoStResults->execute();
        self::$resultat = self::$pdoStResults->fetchAll(PDO::FETCH_OBJ);

        self::$pdoStResults->closeCursor();

        return self::$resultat;
    }
    public static function insert($table,$proprietes,$valeures){
        if (count($proprietes) != count($valeures)){
            throw new Exception("ATTENTION T'AS PAS TOUT BIEN REMPLIS!");
        }
        else{
            self::seConnecter();
            $requeteINSERT = "INSERT INTO $table (";

            //Gestion de l'ajout de chaque propriété de l'array de paramètre
            $firstProp = 0;
            foreach ($proprietes as $unePropriete) {
                if ($firstProp == 0) {
                    $requeteINSERT = $requeteINSERT . $unePropriete;
                    $firstProp = 1;
                } else {
                    $requeteINSERT = $requeteINSERT . "," . $unePropriete;
                }
            }

            $requeteINSERT = $requeteINSERT.") VALUES (";

            //Gestion de l'ajout de chaque VALUE
            $firstValue = 0;
            foreach ($valeures as $uneValeure) {
                if (is_string($uneValeure)) {
                    $uneValeure = "'" . $uneValeure . "'";
                }
                if ($firstValue == 0) {
                    $requeteINSERT = $requeteINSERT . $uneValeure;
                    $firstValue = 1;
                } else {
                    $requeteINSERT = $requeteINSERT . "," . $uneValeure;
                }
            }

            $requeteINSERT = $requeteINSERT.")";

            self::$requete = $requeteINSERT;

            try{
                self::$PDOresults= self::$pdoCnxBase->prepare(self::$requete);
                self::$PDOresults->execute();
                return true;
            }
            catch(PDOException $e)
            {
                echo 'Erreur : '.$e->getMessage();
                echo 'N° : '.$e->getCode();
                return false;
            }
        }
    }
    
    public static function CombiPseudoPassVerif(){
        self::seConnecter();

        self::$requete = "SELECT idMembre FROM membre WHERE PseudoMembre = :PseudoMembre AND PassMembre = :PassMembre";
        self::$pdoStResults = self::$pdoCnxBase->prepare(self::$requete);
        self::$pdoStResults->bindValue(':PseudoMembre', $pseudo);
        self::$pdoStResults->bindValue(':PassMembre', $pass);
        self::$pdoStResults->execute();
        self::$resultat = self::$pdoStResults->fetchAll(PDO::FETCH_OBJ);

        self::$pdoStResults->closeCursor();

        return self::$resultat;
        
        if ($resultat = $requete-fetch(PDO::FETCH_ASSOC)){
            self::$pdoStResults->closeCursor();
            return $resultat['idMembre'];
        }
        return fals;
    }
    public static function LireInfo(){
        self::seConnecter();
        
        self::$requete = "SELECT PseudoMembre, PassMembre FROM membre where idMembre = :id_utilisateur";
        self::$pdoStResults = self::$pdoCnxBase->prepare(self::$requete);
        self::$pdoStResults->bindValue(':id_utilisateur', $id_utilisateur);
        self::$pdoStResults->execute();
        self::$resultat = self::$pdoStResults->fetchAll(PDO::FETCH_OBJ);
        
        if ($resultat = $requete->fetch(PDO::FETCH_ASSOC)){
            self::$pdoStResults->closeCursor();
            return $resultat;
        }
        return false;
    }


}

?>
